package com.micro.ai.models.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.servers.Server;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

/**
 * Knife4j API文档配置
 * 
 * @author micro-ai
 * @since 0.0.1
 */
@Configuration
public class Knife4jConfig {

    /**
     * 全局OpenAPI配置
     */
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("Micro-AI 模型管理服务 API")
                        .description("提供模型供应商、模型类型、模型定义、模型配置、微调任务、微调模型、数据集管理等完整AI模型生命周期管理功能")
                        .version("v0.0.1")
                        .contact(new Contact()
                                .name("Micro-AI Team")
                                .email("support@micro-ai.com")
                                .url("https://micro-ai.com"))
                        .license(new License()
                                .name("Apache 2.0")
                                .url("https://www.apache.org/licenses/LICENSE-2.0.html")))
                .servers(List.of(
                        new Server().url("http://localhost:9003").description("本地环境"),
                        new Server().url("http://localhost:9000/api/models").description("网关路由")
                ))
                // JWT认证配置
                .addSecurityItem(new SecurityRequirement().addList("Bearer认证"))
                .components(new io.swagger.v3.oas.models.Components()
                        .addSecuritySchemes("Bearer认证",
                                new SecurityScheme()
                                        .name("Authorization")
                                        .type(SecurityScheme.Type.HTTP)
                                        .scheme("bearer")
                                        .bearerFormat("JWT")
                                        .description("请在下方输入JWT令牌（无需添加'Bearer '前缀）")));
    }

    /**
     * 模型供应商管理API分组
     */
    @Bean
    public GroupedOpenApi vendorApi() {
        return GroupedOpenApi.builder()
                .group("1-模型供应商管理")
                .pathsToMatch("/api/model-vendors/**")
                .build();
    }

    /**
     * 模型类型管理API分组
     */
    @Bean
    public GroupedOpenApi modelTypeApi() {
        return GroupedOpenApi.builder()
                .group("2-模型类型管理")
                .pathsToMatch("/api/model-types/**")
                .build();
    }

    /**
     * 模型定义管理API分组
     */
    @Bean
    public GroupedOpenApi modelDefinitionApi() {
        return GroupedOpenApi.builder()
                .group("3-模型定义管理")
                .pathsToMatch("/api/model-definitions/**")
                .build();
    }

    /**
     * 模型配置管理API分组
     */
    @Bean
    public GroupedOpenApi modelConfigApi() {
        return GroupedOpenApi.builder()
                .group("4-模型配置管理")
                .pathsToMatch("/api/model-configs/**")
                .build();
    }

    /**
     * 模型版本管理API分组
     */
    @Bean
    public GroupedOpenApi modelVersionApi() {
        return GroupedOpenApi.builder()
                .group("5-模型版本管理")
                .pathsToMatch("/api/model-versions/**")
                .build();
    }

    /**
     * 微调数据集管理API分组
     */
    @Bean
    public GroupedOpenApi fineTuningDatasetApi() {
        return GroupedOpenApi.builder()
                .group("6-微调数据集管理")
                .pathsToMatch("/api/datasets/**")
                .build();
    }

    /**
     * 微调任务管理API分组
     */
    @Bean
    public GroupedOpenApi fineTuningJobApi() {
        return GroupedOpenApi.builder()
                .group("7-微调任务管理")
                .pathsToMatch("/api/fine-tuning-jobs/**")
                .build();
    }

    /**
     * 微调模型管理API分组
     */
    @Bean
    public GroupedOpenApi fineTunedModelApi() {
        return GroupedOpenApi.builder()
                .group("8-微调模型管理")
                .pathsToMatch("/api/fine-tuned-models/**")
                .build();
    }

    /**
     * 模型评估管理API分组
     */
    @Bean
    public GroupedOpenApi modelEvaluationApi() {
        return GroupedOpenApi.builder()
                .group("9-模型评估管理")
                .pathsToMatch("/api/model-evaluations/**")
                .build();
    }

    /**
     * 训练检查点管理API分组
     */
    @Bean
    public GroupedOpenApi trainingCheckpointApi() {
        return GroupedOpenApi.builder()
                .group("10-训练检查点管理")
                .pathsToMatch("/api/training-checkpoints/**")
                .build();
    }

    /**
     * 数据集记录管理API分组
     */
    @Bean
    public GroupedOpenApi datasetRecordApi() {
        return GroupedOpenApi.builder()
                .group("11-数据集记录管理")
                .pathsToMatch("/api/dataset-records/**")
                .build();
    }
}

